<?php
/**
 * Created by PhpStorm.
 * User: edmmss
 * Date: 2018/12/11
 * Time: 18:31
 */

namespace app\modules\command\controller;

use app\modules\command\HelloCommand;
use app\modules\command\Invoker;
use app\modules\command\Receiver;
use yii\web\Controller;

class DefaultController extends Controller
{
    /**
     * 命令行模式示例
     * 为了封装调用和解耦。
     * 我们有一个调用程序和一个接收器。 这种模式使用「命令行」将方法调用委托给接收器并且呈现相同的「执行」方法。
     * 因此，调用程序只知道调用「执行」去处理客户端的命令。接收器会从调用程序中分离出来。
     * 这个模式的另一面是取消方法的 execute()，也就是 undo() 。
     * 命令行也可以通过最小量的复制粘贴和依赖组合（不是继承）被聚合，从而组合成更复杂的命令集。
     *
     * @date   2018/12/13
     * @author edmmss
     * @return bool
     */
    public function actionIndex()
    {
        $invoker = new Invoker();
        $receiver = new Receiver();

        $helloCommand = new HelloCommand($receiver);
        $invoker->setCommand($helloCommand);

        $invoker->run();

        var_dump($receiver->getOutput());

        return true;
    }
}